---
author: hongbo
date: "2020-03-12"
previewImg:
tags:
  - Release
title: Announcing BuckleScript 7.2
description: |
  This release will give us some small quality of life improvements for tool
  builders, better performance, and a new let %private modifier for hiding
  module functionality.
---

## About the Release

Today we are proud to release `bs-platform 7.2`!

For those unfamiliar with bs-platform, it is the platform for compiling
[ReasonML](https://reasonml.github.io/) and [OCaml](https://ocaml.org/) to fast
and readable JavaScript.

You can try it with `npm i bs-platform`!

## Features

### In memory loading stdlib

Since this release, the binary artifacts generated by the stdlib are loaded
from memory instead of an external file systems, which means much faster
compilation and installation.

Previously we recommended installing `bs-platform` globally to save on
installation time.

However, with this release the installation is so fast that we recommend
installing it locally instead - per project - instead, as there's no additional
cost, and it provides better isolation.

You can use it with a nice tool called
[npx](https://www.npmjs.com/package/npx), for example, `npx bsb`.

The installation is also compatible with `--ignore-scripts` for major platforms
(see [Richard Feldman's talk](https://youtu.be/okrB3aJtUaw?t=921) on the
security implications), and is more stable with
[yarn](https://github.com/yarnpkg/yarn)

More technical details can be found in this
[post](https://bucklescript.github.io/blog/2020/02/20/loading-stdlib-in-memory).

### let %private

In OCaml's module system, everything is public by default, the only way to hide some values is by providing a separate signature to list public fields and their types:

```reason
module A : { let b : int} = {
    let a = 3 ;
    let b = 4 ;
}

```

`let` `%private` gives you an option to mark private fields directly

```reason
module A  = {
    let%private a  = 3;
    let b  = 4;
}
```

`let%private` also applies to file level modules, so in some cases, user does not need to provide a separate interface file just to hide some particular values.

Note interface files are still recommended as a general best practice since they give you better separate compilation units and also they're better for documentation. Still, `let%private` is useful in the following scenarios:

- Code generators. Some code generators want to hide some values but it is sometimes very hard or time consuming for code generators to synthesize the types for public fields.

- Quick prototyping. During prototyping, we still want to hide some values, but the interface file is not stable yet, `let%private` provide you such convenience.

### Int64 performance optimization

We received feedback from some users that various Int64 operations became bottlenecks in their code performance, in particular `Int64.to_string`.

We responded to this, and after some hard work - but _without_ changing the underlying representation - our `Int64.to_string` is even faster than `bigint` for common inputs.

A micro-benchmark for comparison:

```
running on 7.1
Int64.to_string: 367.788ms # super positive number
Int64.to_string: 140.451ms # median number
Int64.to_string: 375.471ms # super negative number

bigint
Int64.to_string: 25.151ms
Int64.to_string: 12.278ms
Int64.to_string: 21.011ms

latest
Int64.to_string: 43.228ms
Int64.to_string: 5.764ms
Int64.to_string: 43.270ms
```

We also apply such optimizations to other Int64 operations.

Note that Int64 is implemented in OCaml itself without any raw JavaScript. This is case compelling hints that our optimizing compiler not only provides expressivity and type-safe guarantees, but also empowers users to write maintainable, _efficient_ code.

## File level compilation flags

In this release, we also provide a handy flag to allow users to override some configurations at the file level.

```reason
[@bs.config {flags: [|"-w", "a", "-bs-no-bin-annot"|]}]; // toplevel attributes
```

A full list of changes is available here: https://github.com/BuckleScript/bucklescript/blob/master/Changes.md#72
